// test_video_detail_apis.js - 测试视频详情相关接口
const axios = require('axios');

// 基础配置
const BASE_URL = 'http://localhost:3000/api';
const USER_CREDENTIALS = {
  username: 'user',
  password: '123456'
};

// 测试数据
const TEST_DATA = {
  TEST_VIDEO_ID: 1, // 假设存在的视频ID
  TEST_USER_ID: 2,   // 假设存在的目标用户ID
  TEST_COMMENT: '这是一条测试评论'
};

// 测试结果记录
const testResults = {
  totalTests: 7,
  passedTests: 0,
  failedTests: 0,
  testCases: []
};

/**
 * 记录测试结果
 * @param {string} name - 测试名称
 * @param {boolean} passed - 是否通过
 * @param {string} error - 错误信息
 */
function recordTestResult(name, passed, error = null) {
  testResults.testCases.push({
    name,
    status: passed ? 'passed' : 'failed',
    error
  });
  
  if (passed) {
    testResults.passedTests++;
  } else {
    testResults.failedTests++;
  }
}

/**
 * 登录获取token
 * @returns {Promise<string>} - 用户token
 */
async function login() {
  try {
    const response = await axios.post(`${BASE_URL}/auth/login`, USER_CREDENTIALS);
    if (response.data.code === 200 && response.data.data.token) {
      console.log('登录成功');
      return response.data.data.token;
    } else {
      throw new Error('登录失败');
    }
  } catch (error) {
    console.error('登录失败:', error.message);
    throw error;
  }
}

/**
 * 1. 测试视频详情接口
 */
async function testVideoDetail() {
  try {
    const response = await axios.get(`${BASE_URL}/videos/${TEST_DATA.TEST_VIDEO_ID}`);
    
    if (response.status === 200 && response.data.code === 200) {
      console.log(`  视频详情获取成功，标题：${response.data.data?.title}`);
      recordTestResult('视频详情接口', true);
      return true;
    } else {
      recordTestResult('视频详情接口', false, response.data.message || '未知错误');
      return false;
    }
  } catch (error) {
    recordTestResult('视频详情接口', false, error.message);
    return false;
  }
}

/**
 * 2. 测试点赞视频接口
 * @param {string} token - 用户token
 */
async function testLikeVideo(token) {
  try {
    const response = await axios.post(`${BASE_URL}/interactions/like`,
      { videoId: TEST_DATA.TEST_VIDEO_ID },
      { headers: { Authorization: `Bearer ${token}` } }
    );
    
    if (response.data.code === 200 || response.data.code === 400) {
      // 400可能是因为已经点赞过，这也是可接受的
      console.log('  点赞视频测试通过');
      recordTestResult('点赞视频接口', true);
      return true;
    } else {
      recordTestResult('点赞视频接口', false, response.data.message || '未知错误');
      return false;
    }
  } catch (error) {
    recordTestResult('点赞视频接口', false, error.message);
    return false;
  }
}

/**
 * 测试取消点赞接口
 * @param {string} token - 用户token
 */
async function testUnlikeVideo(token) {
  try {
    const response = await axios.post(`${BASE_URL}/interactions/unlike`,
      { videoId: TEST_DATA.TEST_VIDEO_ID },
      { headers: { Authorization: `Bearer ${token}` } }
    );
    
    if (response.data.code === 200 || response.data.code === 400) {
      // 400可能是因为已经取消点赞过，这也是可接受的
      console.log('  取消点赞测试通过');
      recordTestResult('取消点赞接口', true);
      return true;
    } else {
      recordTestResult('取消点赞接口', false, response.data.message || '未知错误');
      return false;
    }
  } catch (error) {
    recordTestResult('取消点赞接口', false, error.message);
    return false;
  }
}

/**
 * 3. 测试收藏视频接口
 * @param {string} token - 用户token
 */
async function testFavoriteVideo(token) {
  try {
    const response = await axios.post(`${BASE_URL}/interactions/favorite`,
      { videoId: TEST_DATA.TEST_VIDEO_ID },
      { headers: { Authorization: `Bearer ${token}` } }
    );
    
    if (response.data.code === 200 || response.data.code === 400) {
      // 400可能是因为已经收藏过，这也是可接受的
      console.log('  收藏视频测试通过');
      recordTestResult('收藏视频接口', true);
      return true;
    } else {
      recordTestResult('收藏视频接口', false, response.data.message || '未知错误');
      return false;
    }
  } catch (error) {
    recordTestResult('收藏视频接口', false, error.message);
    return false;
  }
}

/**
 * 测试取消收藏接口
 * @param {string} token - 用户token
 */
async function testUnfavoriteVideo(token) {
  try {
    const response = await axios.post(`${BASE_URL}/interactions/unfavorite`,
      { videoId: TEST_DATA.TEST_VIDEO_ID },
      { headers: { Authorization: `Bearer ${token}` } }
    );
    
    if (response.data.code === 200 || response.data.code === 400) {
      // 400可能是因为已经取消收藏过，这也是可接受的
      console.log('  取消收藏测试通过');
      recordTestResult('取消收藏接口', true);
      return true;
    } else {
      recordTestResult('取消收藏接口', false, response.data.message || '未知错误');
      return false;
    }
  } catch (error) {
    recordTestResult('取消收藏接口', false, error.message);
    return false;
  }
}

/**
 * 4. 测试评论视频接口
 * @param {string} token - 用户token
 */
async function testCommentVideo(token) {
  try {
    const response = await axios.post(`${BASE_URL}/interactions/comments`,
      {
        videoId: TEST_DATA.TEST_VIDEO_ID,
        content: TEST_DATA.TEST_COMMENT
      },
      { headers: { Authorization: `Bearer ${token}` } }
    );
    
    if (response.data.code === 200 || response.data.code === 201) {
      console.log('  评论视频测试通过');
      recordTestResult('评论视频接口', true);
      return true;
    } else {
      recordTestResult('评论视频接口', false, response.data.message || '未知错误');
      return false;
    }
  } catch (error) {
    recordTestResult('评论视频接口', false, error.message);
    return false;
  }
}

/**
 * 5. 测试获取评论列表接口
 */
async function testCommentList() {
  try {
    const response = await axios.get(`${BASE_URL}/interactions/comments/${TEST_DATA.TEST_VIDEO_ID}`);
    
    if (response.status === 200 && response.data.code === 200) {
      console.log(`  评论列表获取成功，共${response.data.data?.list?.length || 0}条评论`);
      recordTestResult('评论列表接口', true);
      return true;
    } else {
      recordTestResult('评论列表接口', false, response.data.message || '未知错误');
      return false;
    }
  } catch (error) {
    recordTestResult('评论列表接口', false, error.message);
    return false;
  }
}

/**
 * 6. 测试关注用户接口
 * @param {string} token - 用户token
 */
async function testFollowUser(token) {
  try {
    const response = await axios.post(`${BASE_URL}/interactions/follow`,
      { userId: TEST_DATA.TEST_USER_ID },
      { headers: { Authorization: `Bearer ${token}` } }
    );
    
    if (response.data.code === 200 || response.data.code === 400) {
      // 400可能是因为已经关注过，这也是可接受的
      console.log('  关注用户测试通过');
      recordTestResult('关注用户接口', true);
      return true;
    } else {
      recordTestResult('关注用户接口', false, response.data.message || '未知错误');
      return false;
    }
  } catch (error) {
    recordTestResult('关注用户接口', false, error.message);
    return false;
  }
}

/**
 * 测试取消关注接口
 * @param {string} token - 用户token
 */
async function testUnfollowUser(token) {
  try {
    const response = await axios.post(`${BASE_URL}/interactions/unfollow`,
      { userId: TEST_DATA.TEST_USER_ID },
      { headers: { Authorization: `Bearer ${token}` } }
    );
    
    if (response.data.code === 200 || response.data.code === 400) {
      // 400可能是因为已经取消关注过，这也是可接受的
      console.log('  取消关注测试通过');
      recordTestResult('取消关注用户接口', true);
      return true;
    } else {
      recordTestResult('取消关注用户接口', false, response.data.message || '未知错误');
      return false;
    }
  } catch (error) {
    recordTestResult('取消关注用户接口', false, error.message);
    return false;
  }
}

/**
 * 7. 测试推荐视频列表接口
 */
async function testRecommendedVideos() {
  try {
    const response = await axios.get(`${BASE_URL}/videos/recommended`);
    
    if (response.status === 200 && response.data.code === 200) {
      console.log(`  推荐视频列表获取成功，共${response.data.data?.list?.length || 0}个视频`);
      recordTestResult('推荐视频列表接口', true);
      return true;
    } else {
      recordTestResult('推荐视频列表接口', false, response.data.message || '未知错误');
      return false;
    }
  } catch (error) {
    recordTestResult('推荐视频列表接口', false, error.message);
    return false;
  }
}

/**
 * 运行所有测试
 */
async function runAllTests() {
  console.log('开始测试视频详情相关接口...');
  
  try {
    // 先测试不需要token的接口
    console.log('\n1. 测试视频详情接口');
    await testVideoDetail();
    
    console.log('\n5. 测试评论列表接口');
    await testCommentList();
    
    console.log('\n7. 测试推荐视频列表接口');
    await testRecommendedVideos();
    
    // 登录获取token以测试需要认证的接口
    console.log('\n登录用户获取token...');
    const token = await login();
    
    // 测试需要token的接口
    console.log('\n2. 测试点赞/取消点赞接口');
    await testLikeVideo(token);
    await testUnlikeVideo(token);
    
    console.log('\n3. 测试收藏/取消收藏接口');
    await testFavoriteVideo(token);
    await testUnfavoriteVideo(token);
    
    console.log('\n4. 测试评论视频接口');
    await testCommentVideo(token);
    
    console.log('\n6. 测试关注/取消关注用户接口');
    await testFollowUser(token);
    await testUnfollowUser(token);
    
  } catch (error) {
    console.error('测试过程中发生错误:', error.message);
  } finally {
    // 输出测试结果
    console.log('\n========== 测试结果 ==========');
    console.log(`总测试数: ${testResults.totalTests}`);
    console.log(`通过测试: ${testResults.passedTests}`);
    console.log(`失败测试: ${testResults.failedTests}`);
    console.log('详细结果:');
    testResults.testCases.forEach(test => {
      console.log(`  - ${test.name}: ${test.status}${test.error ? ` (${test.error})` : ''}`);
    });
    
    // 保存测试结果到文件
    const fs = require('fs');
    const resultsFile = 'video_detail_test_results.json';
    testResults.timestamp = new Date().toISOString();
    fs.writeFileSync(resultsFile, JSON.stringify(testResults, null, 2));
    console.log(`\n测试结果已保存到: ${resultsFile}`);
  }
}

// 执行测试
runAllTests();